﻿#pragma once  // 防止头文件重复包含
#include "define.h"  // 包含定义文件
#include <engine_types.hpp>  // 包含引擎类型的头文件
#include <receiver.h>  // 包含接收器的头文件

namespace lt  // 定义在 lt 命名空间中
{
	/***
	 * bar 生成器类，用于从 tick 数据中生成 bar 数据
	 */
	class bar_generator
	{
	private:
		uint32_t _period;  // bar 的周期，以分钟为单位

		bar_info _bar;  // 当前生成的 bar 数据

		uint32_t _minute;  // 当前处理的分钟时间戳

		uint64_t _prev_volume;  // 前一个 tick 的成交量，用于计算增量

		double_t _price_step;  // 价格步长，用于 bar 数据的计算

		std::map<double_t, uint32_t> _poc_data;  // POC 数据，记录各价格对应的成交量

		std::set<lt::bar_receiver*> _bar_callback;  // bar 数据的接收器集合

	public:
		// 构造函数，初始化 bar 生成器
		// 参数：
		// - period: bar 的周期，以分钟为单位
		// - price_step: 价格步长
		bar_generator(uint32_t period, double_t price_step)
			: _period(period), _price_step(price_step), _minute(0), _prev_volume(0) {}

		// 插入 tick 数据，用于生成 bar 数据
		// 参数：
		// - tick: 当前的 tick 数据
		void insert_tick(const tick_info& tick);

		// 添加 bar 数据的接收器
		// 参数：
		// - receiver: 接收 bar 数据的接收器对象
		void add_receiver(lt::bar_receiver* receiver);

		// 移除 bar 数据的接收器
		// 参数：
		// - receiver: 要移除的接收器对象
		void remove_receiver(lt::bar_receiver* receiver);

		// 判断 bar 生成器是否有效（是否有接收器）
		// 返回值：如果接收器集合为空，则返回 true，否则返回 false
		bool invalid() const;
	};

}  // 命名空间结束
